home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 22 / Cream of the Crop 22.iso / os2 / ext2_200.zip / EXT2_SRC.ZIP / 32BITS / EXT2-OS2 / UTIL / DATETIME.C < prev    next >
C/C++ Source or Header  |  1996-09-17  |  2KB  |  68 lines

  1. #ifdef __IBMC__
  2. #pragma strings(readonly)
  3. #endif
  4.  
  5. //
  6. // date_dos2unix  and date_unix2dos are from the Linux FAT file system
  7. //
  8.  
  9. /* Linear day numbers of the respective 1sts in non-leap years. */
  10.  
  11. static int day_n[] = { 0,31,59,90,120,151,181,212,243,273,304,334,0,0,0,0 };
  12.                   /* JanFebMarApr May Jun Jul Aug Sep Oct Nov Dec */
  13.  
  14.  
  15. // extern struct timezone sys_tz;
  16. extern long timezone;
  17.  
  18. /* Convert a MS-DOS time/date pair to a UNIX date (seconds since 1 1 70). */
  19.  
  20. long date_dos2unix(unsigned short time,unsigned short date)
  21. {
  22.         long month,year,secs;
  23.  
  24.         month = ((date >> 5) & 15L)-1L;
  25.         year = date >> 9;
  26.         secs = (time & 31L)*2L+60*((time >> 5) & 63L)+(time >> 11)*3600L+86400L*
  27.             ((date & 31L)-1L+day_n[month]+(year/4L)+year*365L-((year & 3L) == 0 &&
  28.             month < 2L ? 1 : 0)+3653L);
  29.                         /* days since 1.1.70 plus 80's leap day */
  30. //        secs += sys_tz.tz_minuteswest*60;
  31.         secs += timezone;
  32.         return secs;
  33. }
  34.  
  35.  
  36. /* Convert linear UNIX date to a MS-DOS time/date pair. */
  37.  
  38. void date_unix2dos(long unix_date,unsigned short *time,
  39.     unsigned short *date)
  40. {
  41.         long day,year,nl_day,month;
  42.         unsigned long ud;
  43. //        unix_date -= sys_tz.tz_minuteswest*60;
  44.         unix_date -= timezone;
  45. #if 0
  46.         *time = (unsigned short)((unix_date % 60)/2+(((unix_date/60) % 60) << 5)+
  47.             (((unix_date/3600) % 24) << 11));
  48. #else
  49.         ud = (unsigned long) unix_date;
  50.         *time = (unsigned short)((ud % 60)/2+(((ud/60) % 60) << 5)+
  51.             (((ud/3600) % 24) << 11));
  52. #endif
  53.         day = unix_date/86400-3652;
  54.         year = day/365;
  55.         if ((year+3)/4+365*year > day) year--;
  56.         day -= (year+3)/4+365*year;
  57.         if (day == 59 && !(year & 3)) {
  58.                 nl_day = day;
  59.                 month = 2;
  60.         }
  61.         else {
  62.                 nl_day = (year & 3) || day <= 59 ? day : day-1;
  63.                 for (month = 0; month < 12; month++)
  64.                         if (day_n[month] > nl_day) break;
  65.         }
  66.         *date = (unsigned short)(nl_day-day_n[month-1]+1+(month << 5)+(year << 9));
  67. }
  68.